---
# Copyright 2015, Rackspace US, Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

- name: Check for a supported Operating System
  assert:
    that:
      - (ansible_distribution == 'Ubuntu' and ansible_distribution_release == 'xenial') or
        (ansible_os_family == 'RedHat' and ansible_distribution_major_version == '7') or
        (ansible_os_family == 'Suse' and ansible_distribution_major_version == '42')
    msg: "The only supported platforms for this release are Ubuntu 16.04 LTS (Xenial), CentOS 7 (WIP) and openSUSE Leap 42.X (WIP)"
  tags:
    - check-operating-system

- name: Identify the space available in /
  # NOTE(hwoarang): df does not work reliably on btrfs filesystems
  # https://btrfs.wiki.kernel.org/index.php/FAQ#How_much_free_space_do_I_have.3F
  # As such, use the btrfs tools to determine the real available size on the
  # disk
  shell: |
    if [[ $(df -T / | tail -n 1 | awk '{print $2}') == "btrfs" ]]; then
        btrfs fi usage --kbytes / | awk '/^.*Free / {print $3}'| sed 's/\..*//'
    else
        df -BK / | awk '!/^Filesystem/ {print $4}' | sed 's/K//'
    fi
  when:
    - bootstrap_host_data_disk_device == None
  changed_when: false
  register: root_space_available
  tags:
    - check-disk-size

# Convert root_space_available to bytes.
- name: Set root disk facts
  set_fact:
    host_root_space_available_bytes: "{{ ( root_space_available.stdout | int) * 1024 | int }}"
  when:
    - bootstrap_host_data_disk_device == None
  tags:
    - check-disk-size

- name: Set data disk facts
  set_fact:
    host_data_disk_sectors: "{{ (ansible_devices[bootstrap_host_data_disk_device]['sectors'] | int) }}"
    host_data_disk_sectorsize: "{{ (ansible_devices[bootstrap_host_data_disk_device]['sectorsize'] | int) }}"
  when:
    - bootstrap_host_data_disk_device != None
  tags:
    - check-disk-size

# Calculate the size of the bootstrap_host_data_disk_device by muliplying sectors with sectorsize.
- name: Calculate data disk size
  set_fact:
    host_data_disk_size_bytes: "{{ ((host_data_disk_sectors | int) * (host_data_disk_sectorsize | int)) | int }}"
  when:
    - bootstrap_host_data_disk_device != None
  tags:
    - check-disk-size

# Convert bootstrap_host_data_disk_min_size to bytes.
- name: Set min size fact
  set_fact:
    host_data_disk_min_size_bytes: "{{ ((bootstrap_host_data_disk_min_size | int) * 1024**3) | int }}"
  tags:
    - check-disk-size

- name: Set size facts
  set_fact:
    root_gb_available: "{{ ((host_root_space_available_bytes | int ) / 1024**3) | round(2, 'floor') }}"
  when: bootstrap_host_data_disk_device == None
  tags:
    - check-disk-size

- name: Set disk size facts
  set_fact:
    disk_gb_available: "{{ ((host_data_disk_size_bytes | int ) / 1024**3) | round(2, 'floor') }}"
  when: bootstrap_host_data_disk_device != None
  tags:
    - check-disk-size

- name: Fail if there is not enough space available in /
  fail:
    msg: |
      Not enough space available in /.
      Found {{ root_gb_available }} GB, required {{ bootstrap_host_data_disk_min_size }} GB)
  when:
    - bootstrap_host_data_disk_device == None
    - (host_root_space_available_bytes | int) < (host_data_disk_min_size_bytes | int)
  tags:
    - check-disk-size

- name: Fail if there is not enough disk space available (disk specified)
  fail:
    msg: |
      Not enough disk space available.
      Found {{ disk_gb_available }} GB, required {{ bootstrap_host_data_disk_min_size }} GB)
  when:
    - bootstrap_host_data_disk_device != None
    - (host_data_disk_size_bytes | int) < (host_data_disk_min_size_bytes | int)
  tags:
    - check-disk-size

- name: Ensure that the kernel has VXLAN support
  modprobe:
    name: vxlan
    state: present
  tags:
    - check-vxlan
